/*
用户密码复杂度验证(封装成函数)
	长度超过8位(+1)
	包括大、小写字母、数字、其他符号，以上四种至少三种(+1)
	不能有长度超过或等于3的字串重复(+1)
	密码的评分等级默认2分，以上条件满足一条加一分·1
	返回密码的评分等级，及要改进的点:
	如['长度小于8','密码没有由3种以上字符组成']
*/
package main

import (
	"fmt"
	"strings"
	"unicode"
)

//检查密码长度是否超过8位
func check_length(passwd string)bool{
	return len(passwd) > 8
}

//for _, i := range passwd 是 Go 语言中的一种语法。
//这种语法用于遍历字符串 passwd 中的每个字符。
//range 关键字用于遍历字符串中的每个字符。在每次迭代中，i
//变量会被赋值为当前遍历到的字符。而 _ 则是一个占位符，表示我们
//不关心 range 返回的索引值。
//检查是否有大小写字母，数字，其他符号
func check_cha(passwd string) bool {
	var hasUpper, hasLower, hasNumber,hasSpecial bool
	for _, i := range passwd{
		switch{
		case unicode.IsUpper(i):
			hasUpper = true
		case unicode.IsLower(i):
			hasLower = true
		case unicode.IsNumber(i):
			hasNumber = true
		case unicode.IsPunct(i) || unicode.IsSymbol(i):
			hasSpecial = true
		}
	}
	count := 0
	if hasUpper{
		count ++
	}
	if hasLower{
		count ++
	}
	if hasNumber{
		count ++
	}
	if hasSpecial{
		count ++
	}
	return count >= 3
}

//检查是否有长度超过或等于3的重复字符串
func check_re(passwd string) bool{
	for i := 0; i < len(passwd) - 2;i++{
		if strings.Contains(passwd[i+3:], passwd[i:i+3]){
			return false
		}
	}
	return true
}

//将以上条件整合
func check(passwd string) (int, []string) {
	score := 2
	problems := []string{}

	if check_length(passwd){
		score ++
	}else{
		problems = append(problems,"长度小于8")
	}

	if check_cha(passwd){
		score ++
	}else{
		problems = append(problems,"密码没有由三种以上字符组成")
	}

	if check_re(passwd){
		score ++
	}else{
		problems = append(problems,"有长度超过或等于3的字符串重复")
	}
	return score, problems
}

//主函数对以上函数进行调用
func main(){
	var passwd string
	fmt.Println("请输入你的密码:")
	fmt.Scan(&passwd)
	score, problems := check(passwd)
	fmt.Println("密码评分等级：",score)
	fmt.Println("需要改进的地方",problems)
}


